From 273c94e1942566cdc2b2bd9a3e031a74f5b71b52 Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Wed, 25 Apr 2007 23:44:54 +0000 Subject: [PATCH] Win32 drop shadow goodness svn path=/trunk/; revision=17643 --- ChangeLog | 13 +++++++ docs/reference/gdk/tmpl/windows.sgml | 2 + gdk/directfb/gdkwindow-directfb.c | 3 ++ gdk/gdkwindow.h | 18 +++++---- gdk/linux-fb/gdkwindow-fb.c | 3 ++ gdk/quartz/gdkwindow-quartz.c | 3 ++ gdk/win32/gdkwindow-win32.c | 55 +++++++++++++++++++++------- gdk/x11/gdkwindow-x11.c | 3 ++ gtk/gtkhandlebox.c | 3 +- gtk/gtkwindow.c | 5 +-- 10 files changed, 82 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c0cecea7a..fe1e77967d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2007-04-25 Cody Russell + + * gdk/gdkwindow.h: + * gtk/gtkwidget.c: + * gtk/gtkhandlebox.c: + * gdk/directfb/gdkwindow-directfb.c: + * gdk/linux-fb/gdkwindow-fb.c: + * gdk/quartz/gdkwindow-quartz.c: + * gdk/win32/gdkwindow-win32.c: + * gdk/x11/gdkwindow-x11.c: + Added window type hint and implement drop shadows on Win32 + for menus, tooltips, etc. (#148535, Tim Evans, Dom Lachowicz) + 2007-04-25 Jakub Steiner * gtk/stock-icons/16/gtk-close.{png,svg}: added 16x16 version of diff --git a/docs/reference/gdk/tmpl/windows.sgml b/docs/reference/gdk/tmpl/windows.sgml index 3d79c6c5fc..2f87774e0d 100644 --- a/docs/reference/gdk/tmpl/windows.sgml +++ b/docs/reference/gdk/tmpl/windows.sgml @@ -237,6 +237,7 @@ Attributes to use for a newly-created window. @wmclass_name: don't use (see gtk_window_set_wmclass()) @wmclass_class: don't use (see gtk_window_set_wmclass()) @override_redirect: %TRUE to bypass the window manager +@type_hint: a hint of the function of the window @@ -256,6 +257,7 @@ corresponding flag in #GdkWindowAttributesType. @GDK_WA_VISUAL: Honor the visual field @GDK_WA_WMCLASS: Honor the wmclass_class and wmclass_name fields @GDK_WA_NOREDIR: Honor the override_redirect field +@GDK_WA_TYPE_HINT: Honor the type_hint field diff --git a/gdk/directfb/gdkwindow-directfb.c b/gdk/directfb/gdkwindow-directfb.c index 9c40031642..0c5cdf43e4 100644 --- a/gdk/directfb/gdkwindow-directfb.c +++ b/gdk/directfb/gdkwindow-directfb.c @@ -559,6 +559,9 @@ gdk_directfb_window_new (GdkWindow *parent, gdk_directfb_event_windows_add (window); } + if (attributes_mask & GDK_WA_TYPE_HINT) + gdk_window_set_type_hint (window, attributes->type_hint); + return window; } diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index be1fc2b1e3..325c4b3d88 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -85,14 +85,15 @@ typedef enum */ typedef enum { - GDK_WA_TITLE = 1 << 1, - GDK_WA_X = 1 << 2, - GDK_WA_Y = 1 << 3, - GDK_WA_CURSOR = 1 << 4, - GDK_WA_COLORMAP = 1 << 5, - GDK_WA_VISUAL = 1 << 6, - GDK_WA_WMCLASS = 1 << 7, - GDK_WA_NOREDIR = 1 << 8 + GDK_WA_TITLE = 1 << 1, + GDK_WA_X = 1 << 2, + GDK_WA_Y = 1 << 3, + GDK_WA_CURSOR = 1 << 4, + GDK_WA_COLORMAP = 1 << 5, + GDK_WA_VISUAL = 1 << 6, + GDK_WA_WMCLASS = 1 << 7, + GDK_WA_NOREDIR = 1 << 8, + GDK_WA_TYPE_HINT = 1 << 9 } GdkWindowAttributesType; /* Size restriction enumeration. @@ -213,6 +214,7 @@ struct _GdkWindowAttr gchar *wmclass_name; gchar *wmclass_class; gboolean override_redirect; + GdkWindowTypeHint type_hint; }; struct _GdkGeometry diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c index bd0f5494df..fa0e025722 100644 --- a/gdk/linux-fb/gdkwindow-fb.c +++ b/gdk/linux-fb/gdkwindow-fb.c @@ -268,6 +268,9 @@ gdk_window_new (GdkWindow *parent, if (parent_private) parent_private->children = g_list_prepend (parent_private->children, window); + if (attributes_mask & GDK_WA_TYPE_HINT) + gdk_window_set_type_hint (window, attributes->type_hint); + return window; } diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 93b2f218e8..6003064180 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -708,6 +708,9 @@ gdk_window_new (GdkWindow *parent, GDK_QUARTZ_RELEASE_POOL; + if (attributes_mask & GDK_WA_TYPE_HINT) + gdk_window_set_type_hint (window, attributes->type_hint); + return window; } diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index 3a52f5824b..9d029619ab 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -311,12 +311,13 @@ get_default_title (void) * get its own class */ static ATOM -RegisterGdkClass (GdkWindowType wtype) +RegisterGdkClass (GdkWindowType wtype, GdkWindowTypeHint wtype_hint) { - static ATOM klassTOPLEVEL = 0; - static ATOM klassDIALOG = 0; - static ATOM klassCHILD = 0; - static ATOM klassTEMP = 0; + static ATOM klassTOPLEVEL = 0; + static ATOM klassDIALOG = 0; + static ATOM klassCHILD = 0; + static ATOM klassTEMP = 0; + static ATOM klassTEMPSHADOW = 0; static HICON hAppIcon = NULL; static HICON hAppIconSm = NULL; static WNDCLASSEXW wcl; @@ -412,14 +413,35 @@ RegisterGdkClass (GdkWindowType wtype) break; case GDK_WINDOW_TEMP: - if (0 == klassTEMP) - { - wcl.lpszClassName = L"gdkWindowTemp"; - wcl.style |= CS_SAVEBITS; - ONCE_PER_CLASS (); - klassTEMP = RegisterClassExW (&wcl); - } - klass = klassTEMP; + if ((wtype_hint == GDK_WINDOW_TYPE_HINT_MENU) || + (wtype_hint == GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU) || + (wtype_hint == GDK_WINDOW_TYPE_HINT_POPUP_MENU) || + (wtype_hint == GDK_WINDOW_TYPE_HINT_TOOLTIP)) + { + if (klassTEMPSHADOW == 0) + { + wcl.lpszClassName = "gdkWindowTempShadow"; + wcl.style |= CS_SAVEBITS; + if (_winver >= 0x0501) /* Windows XP (5.1) or above */ + wcl.style |= 0x00020000; /* CS_DROPSHADOW */ + ONCE_PER_CLASS (); + klassTEMPSHADOW = RegisterClassEx (&wcl); + } + + klass = klassTEMPSHADOW; + } + else + { + if (klassTEMP == 0) + { + wcl.lpszClassName = "gdkWindowTemp"; + wcl.style |= CS_SAVEBITS; + ONCE_PER_CLASS (); + klassTEMP = RegisterClassEx (&wcl); + } + + klass = klassTEMP; + } break; default: @@ -638,10 +660,15 @@ gdk_window_new_internal (GdkWindow *parent, private->event_mask = GDK_STRUCTURE_MASK | attributes->event_mask; + if (attributes_mask & GDK_WA_TYPE_HINT) + impl->type_hint = attributes->type_hint; + else + impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL; + if (private->parent) private->parent->children = g_list_prepend (private->parent->children, window); - klass = RegisterGdkClass (private->window_type); + klass = RegisterGdkClass (private->window_type, impl->type_hint); wtitle = g_utf8_to_utf16 (title, -1, NULL, NULL, NULL); diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 533387fc6f..fe5a0976f3 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -929,6 +929,9 @@ gdk_window_new (GdkWindow *parent, break; } + if (attributes_mask & GDK_WA_TYPE_HINT) + gdk_window_set_type_hint (window, attributes->type_hint); + return window; } diff --git a/gtk/gtkhandlebox.c b/gtk/gtkhandlebox.c index 6814fcfd2b..064f3354ee 100644 --- a/gtk/gtkhandlebox.c +++ b/gtk/gtkhandlebox.c @@ -441,7 +441,8 @@ gtk_handle_box_realize (GtkWidget *widget) GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes.type_hint = GDK_WINDOW_TYPE_HINT_TOOLBAR; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_TYPE_HINT; hb->float_window = gdk_window_new (gtk_widget_get_root_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (hb->float_window, widget); diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index b780c61c72..0b47429f1b 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4441,8 +4441,9 @@ gtk_window_realize (GtkWidget *widget) GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK); + attributes.type_hint = priv->type_hint; - attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes_mask |= GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_TYPE_HINT; attributes_mask |= (window->title ? GDK_WA_TITLE : 0); attributes_mask |= (window->wmclass_name ? GDK_WA_WMCLASS : 0); @@ -4474,8 +4475,6 @@ gtk_window_realize (GtkWidget *widget) if (!priv->deletable) gdk_window_set_functions (widget->window, GDK_FUNC_ALL | GDK_FUNC_CLOSE); - gdk_window_set_type_hint (widget->window, priv->type_hint); - if (gtk_window_get_skip_pager_hint (window)) gdk_window_set_skip_pager_hint (widget->window, TRUE); -- 2.30.2